package com.cmsz.xpay.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.cmsz.xpay.common.exception.DefaultReturnCode;
import com.cmsz.xpay.common.exception.UpayBusinessException;
import com.cmsz.xpay.common.exception.UpaySystemException;
/**
 * 日期时间校验工具
 * 通过比对格式转换前后的值是否一致判断日期时间是否合法
 * 非法时间示例：
 * 20160230,20160210250000
 * @author Eshin
 *
 */
public class TimeValidateUtil {
	/**
	 * 校验日期合法性(yyyyMMdd)
	 * @param dates	需要校验的数据，二维数组{{校验的字段描述，校验的字段值}, {校验的字段描述，校验的字段值}}
	 * @throws ArgumentException	校验不通过时抛出此异常
	 */
	public static void validateYYYYMMDD(String[][] dates)  {
	
		validateDateTime(dates, "yyyyMMdd");
		
	}
	
	/**
	 * 校验时间合法性(yyyyMMddHHmmssSSS)
	 * @param datetimes	需要校验的数据，二维数组{{校验的字段描述，校验的字段值}, {校验的字段描述，校验的字段值}}
	 * @throws ArgumentException	校验不通过时抛出此异常
	 */
	public static void validateYYYYMMDDHHMMSS(String[][] datetimes)  {
		validateDateTime(datetimes, "yyyyMMddHHmmss");
	}
	
	/**
	 * 校验日期时间合法性
	 * @param dates	需要校验的数据，二维数组{{校验的字段描述，校验的字段值}, {校验的字段描述，校验的字段值}}
	 * @param dateFormat	日期格式，如(yyyyMMdd, yyyyMMddHHmmss)
	 * @throws ArgumentException	校验不通过时抛出此异常
	 */
	public static void validateDateTime(String[][] dates, String dateFormat) {
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		for (String[] array : dates) {
			String key = array[0];
			String value = array[1];
			if (value == null || value.trim().equals("")) {
				continue;	// 空值不做校验
			}
			String desc = DefaultReturnCode.UPAY_014A04.getRspDesc() + "，" + key +"参数不正确";
			try {
				Date date = sdf.parse(value);
				String newValue = sdf.format(date);
				if (!value.equals(newValue)) {	// 非法日期，如：20150230
					throw new UpayBusinessException(desc, DefaultReturnCode.UPAY_014A04);
				}
			} catch (ParseException e) {
				throw new UpaySystemException("string转换成date异常", DefaultReturnCode.UPAY_015A03);
			}
		}
	}
	
}
